package kz.home.gui;

import kz.home.db.DBUtils;
import kz.home.http.Http;
import kz.home.parser.JSONParser;
import kz.home.utils.Utils;

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import java.util.Hashtable;
import java.util.Vector;

/**
 * <strong>title</strong>
 * <p> describe
 *
 * @author: Danik <br>
 * Date: 29.07.2009  <br>
 * Time: 18:52:17  <br>
 */
public class ResultForm extends BaseForm {
    protected Vector vector;
    protected Command cmd_address = new Command("Адрес", Command.BACK, 2);
    private int type;


    public ResultForm(String title, BaseForm mainScreen, Display display, Hashtable table, int type) {
        super(title, mainScreen, display, table);
        this.type = type;

        init();
    }

    private void init() {
        new Thread(){
            public void run() {
                performRequest(makeRequest());
            }
        }.start();
    }

    protected String makeRequest() {
        return add("date") + "&" + add("cit") + "&" + add("cin") + "&" + add("mov");
    }

    private String add(String key) {
        return (request.containsKey(key)) ? key + "[]=" + request.get("" + key) : "";
    }

    private void initView() {
        deleteAll();
        setTitle(getTitle() + " на " + request.get("date"));
        vector = DBUtils.getFromDB(DBUtils.TIMETABLE);

        if (vector == null || vector.size() == 0) {
            return;
        }

        addCommand(cmd_address);

        for (int i = 0; i < vector.size(); i++) {
            if (vector.elementAt(i) instanceof Vector) {
                Vector innerVector = (Vector) vector.elementAt(i);

                if (innerVector.size() < 8) {
                    append("не верный формат данных полученый при запросе. size{" + innerVector.size() + "}");
                    return;
                }
                append(cinemaOrMovie(innerVector)
                                + "\n Зал: " + map(DBUtils.ROOMS, innerVector.elementAt(3), 1) // фильм
                                + "\n Время: " + getTime(innerVector.elementAt(4)) // время
                                + "\n Цена Взрослый: " + getPrice(innerVector.elementAt(5)) // цена взр
                                + "\n Цена Студент: " + getPrice(innerVector.elementAt(6)) // цена студ
                                + "\n Цена Детский: " + getPrice(innerVector.elementAt(7))  // цена детская
                );
            }
        }
    }

    protected String map(String dbName, Object id, int number) {
        Vector data = DBUtils.findInTable(dbName, "" + id);

        if (data.size() >= number) {
            return "" + data.elementAt(number);
        } else {
            return "Данные для " + dbName + "[" + id + "] не найдены.";
        }
    }

    protected String cinemaOrMovie(Vector row) {
        if (type == 1) return "Фильм: " + map(DBUtils.MOVIES, row.elementAt(2), 1);        // фильм;
        if (type == 2) return "Кинотеатр: " + map(DBUtils.CINEMAS, row.elementAt(1), 1); // кинотеатр;
        return "unknown type[" + type + "]";
    }

    protected void performRequest(String request) {
        removeCommand(cmd_address);
        append("Удаление старых данных...");
        DBUtils.deleteDB(DBUtils.TIMETABLE);
        append("Старые данные удалены.");

        try {
            Utils.print("request[" + request + "]");

            append("Запрос данных...");
            String result = Http.getInstance().sendRequest(req_url, request);
            append("Данные получены.");

            Utils.print("response[" + result + "]");

            Utils.print("start parsing");
            append("Парсинг и сохрание данных...");
            JSONParser parser = new JSONParser();
            parser.parseAndSaveTimeTable(result);
            append("Парсинг и сохрание данных завершенно.");

            initView();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    protected String getTime(Object obj) {
        String str = (String) obj;
        if (str.length() == 4) //1200
            return str.substring(0, 2) + ":" + str.substring(2);
        return str;
    }

    protected String getPrice(Object price) {
        return "0".equals("" + price) ? "-" : "" + price;
    }

    public void commandAction(Command command, Displayable displayable) {
        super.commandAction(command, displayable);

        if (command == cmd_address) {
            if (vector != null && vector.size() >= getSelectedIndex()) {
                Vector innerVector = (Vector) vector.elementAt(getSelectedIndex());
                Utils.print("cinema ID[" + innerVector.elementAt(1) + "]");
                AddressForm form = new AddressForm(this, display, request, "" + innerVector.elementAt(1));
                display.setCurrent(form);
            }
        }
    }
}